﻿// 3527. 旋转矩阵.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <memory.h>

using namespace std;
/*
https://www.acwing.com/problem/content/3530/

任意输入两个 9阶以下矩阵，要求判断第二个是否是第一个的旋转矩阵（顺时针），
如果是，输出旋转角度（0、90、180、270），如果不是，输出 −1。

输入格式
第一行包含整数 n，表示矩阵阶数。

接下来 n行，每行包含 n个空格隔开的整数，表示第一个矩阵。

再接下来 n行，每行包含 n个空格隔开的整数，表示第二个矩阵。

输出格式
判断第二个矩阵是否是第一个的旋转矩阵，如果是，
输出旋转角度（0、90、180、270），如果不是，输出 −1。

如果旋转角度的结果有多个，则输出最小的那个。

数据范围
1≤n≤9
,
矩阵中元素取值范围 [1,9]
输入样例：
3
1 2 3
4 5 6
7 8 9
7 4 1
8 5 2
9 6 3
输出样例：
90
*/

int n;

const int N = 10;
int f[N][N];
int t[N][N];

////顺时针旋转90°
//vector<vector<int>> turn(vector<vector<int>> a)
//{
//	vector<vector<int>> res = a;
//
//	for (int i = 0; i < n; i++)
//	{
//		for (int j = 0; j < n; j++) res[i][j] = a[n - j - 1][i];
//	}
//	return res;
//}

void turn(int f[][N]) {
	int cp[N][N]; memcpy(cp, f, sizeof cp);

	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			f[i][j] = cp[n - j - 1][i];
		}
	}
}

bool isEqual(int f[][N], int t[][N]) {
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			if (f[i][j] != t[i][j]) return  false;
		}
	}

	return true;
}


int main()
{
	cin >> n;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			cin >> f[i][j];
		}
	}
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			cin >> t[i][j];
		}
	}

	if (isEqual(f, t)) {
		cout << 0 << endl; return 0;
	}
	turn(f);
	if (isEqual(f, t)) {
		cout << 90 << endl; return 0;
	}
	turn(f);
	if (isEqual(f, t)) {
		cout << 180 << endl; return 0;
	}
	turn(f);
	if (isEqual(f, t)) {
		cout << 270 << endl; return 0;
	}
	
	cout << -1 << endl;
	return 0;
}

 